#ifndef __FSM_LITE_PRO_H__
#define __FSM_LITE_PRO_H__

#include "stdint.h"

#define fsm_sta_t   uint8_t
#define fsm_time_t  uint16_t

// 此处定义 用户任务ID
typedef enum TaskID_Tag{
    FSM_Sys_TaskID = 0,     // 系统ID
    FSM_Uart_TaskID,        // 串口ID
    
    FSM_Max_TaskID
} FSM_TaskID;

typedef fsm_sta_t (*fsm_func)(FSM_TaskID id);

typedef struct FSM_Lite_T
{
    fsm_sta_t   Status;     // 处理状态
    fsm_sta_t   Event;      // 设置事件
    fsm_time_t  nTicks;     // 延时tick
    uint8_t     Run;        // 运行标志

    fsm_func    func;       // 回调函数
} FSM_TypeDef;

void FSM_Task_Init(FSM_TaskID id, fsm_func func);
void FSM_Task_Start(FSM_TaskID id, fsm_sta_t evt, fsm_time_t tick);
void FSM_Task_Stop(FSM_TaskID id);
void FSM_Task_Run(void);
void FSM_Timer_Run(void);

fsm_sta_t FSM_Evt_Set(FSM_TaskID id, fsm_sta_t evt);
fsm_sta_t FSM_Evt_Clr(FSM_TaskID id, fsm_sta_t evt);
fsm_sta_t *FSM_GetSta(FSM_TaskID id);


/* ********************** 任务使用示例
 *
 *   // 事件定义
 *   #define FSM_Init_Evt    0x01     // 初始状态
 *   #define FSM_Time_Evt    0x02     // 定时任务
 *   #define FSM_IDLE_Evt    0x04     // 休眠任务
 *   #define FSM_User_Evt    0x08     // 用户任务
 *   #define FSM_All_Evt     0xFF     // 所有事件 
 * 
 *   // 应用示例
 *   fsm_sta_t System_App(FSM_TaskID id)
 *   {
 *       fsm_sta_t *Status = FSM_GetSta(id);
 * 
 *       if (*Status & Sys_Init_Evt)
 *       {
 *           // 延时10 个时钟tick后运行 Sys_Time_Evt 事件
 *           FSM_Task_Start(id, Sys_Time_Evt, 10);
 *
 *           Init_Bsp();
 *           SysTick_Start();     //启动Systick
 *           
 *           // 清除事件状态
 *           return *Status ^= Sys_Init_Evt;
 *       }
 * 
 *       if (*Status & Sys_IDLE_Evt)
 *       {
 *           Disable_Interrupt();
 *
 *           // 清除所有状态
 *           FSM_Task_Init(id, 0);
 *
 *           // 关闭外设 | 看门狗 | GPIO | ADC
 *           // 设置唤醒Pin
 *           // 进入休眠
 *
 *           // 按键唤醒后...
 *           // 判断唤醒条件, 是否允许唤醒
 *           if (Flow_Control.BatV_SuperLow_Sta == 0 || USB_IN_Pin)
 *           {
 *               SWDTEN = 1;  // 打开看门狗
 *
 *               FSM_Task_Start(id, Sys_Init_Evt, 0);
 *           }
 *           else
 *           {
 *              // 条件不允许工作, 继续休眠
 *              FSM_Task_Start(id, Sys_IDLE_Evt, 0);
 *           }
 *
 *           // 特殊情况 不清除状态
 *           return *Status;
 *       }
 *
 *       return 0;
 *   }
 *
 *   void main(void)
 *   {
 *       FSM_Task_Init(FSM_Sys_TaskID, System_App);   // 初始化任务体
 *
 *       // 运行初始化任务
 *       FSM_Task_Start(FSM_Sys_TaskID, Sys_Init_Evt, 0);
 *       
 *       for ( ; ; )
 *       {
 *           FSM_Task_Run();
 *           
 *           // 喂狗
 *           // CLRWDT();
 *       }
 *   }
 *
 *   // 定时器中断
 *   void SysTick_ISR() interrupt 1 using 1 
 *   {
 *       FSM_Timer_Run();
 *   }
 * 
 * 
 * */

#endif
